knitr::opts_chunk$set(echo = TRUE)
set.seed(23)
library(dplyr)
library(ggplot2)
library(caret)
library(lattice)
library(reshape)
source("https://raw.githubusercontent.com/briatte/ggcorr/master/ggcorr.R")
#wczytanie danych ze strony do data.frame
data_set <- read.csv("http://www.cs.put.poznan.pl/dbrzezinski/teaching/zed/elektrownie.csv")
#dodanie do data.frame kolumny zawierającej godzinę i miesiąc, wyodrębione z kolumny "data"
data_set$godzina <- as.numeric(format(as.POSIXct(factor(data_set$data),format="%m/%d/%Y %H:%M"),"%H"))
data_set$miesiac <- as.numeric(format(as.POSIXct(factor(data_set$data),format="%m/%d/%Y %H:%M"),"%m"))
not_empty_radiation <- data_set %>% filter(irradiamento != 0)
empty_radiation <- data_set %>% filter(irradiamento == 0)
for(i in 1:nrow(empty_radiation))
{
row <- empty_radiation[i,]
m <- not_empty_radiation %>% filter(miesiac == empty_radiation[i,"miesiac"], godzina == empty_radiation[i,"godzina"], idsito == empty_radiation[i, "idsito"])
if (nrow(m) ==0)
{
empty_radiation[i,"irradiamento"] <- 0
}
else
{
empty_radiation[i,"irradiamento"] <- mean(m[["irradiamento"]]) #summarize(m, irra_mean = mean(irradiamento))
}
}
#połączenie dwóch data frameów, w wynikowy "data1"
data_set1 <- rbind(empty_radiation, not_empty_radiation)
Zaimportowany zbiór zawiera dane pochodzące z czujników umieszczonych przy panelach fotowoltaicznych, umieszczonych w trzech sąsiadujących elektrowni słonecznych we Włoszech. Zbiór składa się z 235790 wierdzy oraz 51 kolumn. Celem analizy jest znalezienie czynnika, który najtrafniej pozwoli przewidzieć wartość wytworzonej energi przez panele fotowoltaiczne. Każdy wiersz zawiera uśrednione dane z jednej godziny pomiarów pojedynczej jednostki fotowoltaicznej.
Kolumny zbioru danych dotyczą specyfikacji panelu (identyfikator panelu, modelu, firmy), wartości czynników pogodowych (napromieniowanie, ciła wiatru, zachmurzenie, ciśnienie, wilgotność, punkt rosy), położenia geograficznego(długość i szerokość geograficzna panelu, wysokość, azymut), daty pomiaru (dzien, rok, pelna data) oraz wartości współczynnika “pcnm”.
W zbiorze danych znajują się wartości zerowe, nie tylko w miejscach gdzie żeczywiście odnotowany został taki pomiar, ale także gdzie, poprzez usterke panelu nie doszło do pomiaru. Powyższy wniosek opiera się na analizie pomiarów dokonanych o zbliżonej porze dnia, roku oraz stopniu zachmurzenia.
Położenie geograficzne nie jest bardzo istotne, ponieważ wszystkie panele są rozmieszczone w stosunkowo niewielkich odległościach (sasiednie elektrownie na terenie jednego kraju, takie samej strefy klimatycznej i wysokości nad poziomem morza). W kategorii czynników pogodowych, najbardziej istotne jest napromieniowanie, ponieważ to od stopnia nasłoneczenie zależy wartość kwh. Z tym bezpośrednio związana jest data pomiaru, ponieważ siła napromieniowania jest różna w zależności od pory dnia i roku. Dlatego też wartości “puste” najbardziej dotlikwe są dla danych dotyczących napromieniowania.
Nastepnie sporządzone zostały hostogramy dla atrybutów oraz korelacja pomiędzy poszczególnymi zmiennymi zbioru danych. Zgodnie z początkową analizą korelacja ukazała, ze na ilość wytwarzanej energii ma wpływ promieniowanie, a także wilgotność. Te argumenty zostały wskazane do regresji.
#uwtorzenie podsumowania, statystyk ze zbioru danych "dataset".
selected_data <- select(data_set1,idsito, idbrand, idmodel,temperatura_ambiente, irradiamento, pressure, windspeed, humidity, cloudcover,dewpoint, kwh, azimuth)
summary(selected_data)
## idsito idbrand idmodel temperatura_ambiente
## Min. :0.0000 Min. :0.0000 Min. :0.0000 Min. :0.0450
## 1st Qu.:0.1000 1st Qu.:0.0830 1st Qu.:0.1670 1st Qu.:0.2120
## Median :0.2250 Median :0.1670 Median :0.2080 Median :0.3480
## Mean :0.2147 Mean :0.1519 Mean :0.2426 Mean :0.3734
## 3rd Qu.:0.3250 3rd Qu.:0.1670 3rd Qu.:0.2920 3rd Qu.:0.5300
## Max. :0.4250 Max. :0.4170 Max. :0.7500 Max. :0.8180
## irradiamento pressure windspeed humidity
## Min. :0.00000 Min. :0.0000 Min. :0.00000 Min. :0.1600
## 1st Qu.:0.00000 1st Qu.:0.7480 1st Qu.:0.04200 1st Qu.:0.5400
## Median :0.04273 Median :0.7530 Median :0.06600 Median :0.7000
## Mean :0.11231 Mean :0.6504 Mean :0.07622 Mean :0.6844
## 3rd Qu.:0.20900 3rd Qu.:0.7550 3rd Qu.:0.10200 3rd Qu.:0.8400
## Max. :0.71000 Max. :0.7690 Max. :0.69600 Max. :1.0000
## cloudcover dewpoint kwh azimuth
## Min. :0.000 Min. :0.1390 Min. :0.0000 Min. :0.1280
## 1st Qu.:0.230 1st Qu.:0.5350 1st Qu.:0.0000 1st Qu.:0.2950
## Median :0.310 Median :0.6190 Median :0.0490 Median :0.4250
## Mean :0.359 Mean :0.6055 Mean :0.1688 Mean :0.4546
## 3rd Qu.:0.510 3rd Qu.:0.6830 3rd Qu.:0.3320 3rd Qu.:0.6350
## Max. :1.000 Max. :0.8650 Max. :1.0000 Max. :0.8180
#Wybranie określonych kolumn ze zbioru dataset, po wcześniejszej pobieżnej analizie ich ważności. Wybrane zostały głównie kolumny związane z czynnikami pogodowymi a także identyfikator panela fotowoltaicznego oraz wartość prezentującą wytworzoną energię.
selected_data <- select(data_set1,idsito, idbrand, idmodel,temperatura_ambiente, irradiamento, pressure, windspeed, humidity, cloudcover,dewpoint, kwh, azimuth)
#W poniższym kroku konstruowany jest wykres za pomocą funkcji "ggplot", który przedtawia rozkład wartości każdego z aktrybutów.
p <- ggplot(data = melt(selected_data), aes(x = value)) +
geom_histogram(bins=10, aes(fill=..count..)) +
labs(title = "Rozkład wartości atrybutów - histogram") +
facet_wrap(~variable, ncol=4) +
scale_x_continuous(labels = scales::comma) +
scale_fill_gradient("Count", low="blue", high="pink") +
theme_bw()
## Using as id variables
ggplotly(p)
selected_data <- select(data_set1,idsito, idbrand, idmodel, ageinmonths, temperatura_ambiente, irradiamento, pressure, windspeed, humidity, cloudcover,dewpoint,godzina, miesiac, kwh)
ggcorr(data_set, nbreaks = 4, label = TRUE, label_size = 2, label_color = "white")
##
## Attaching package: 'reshape2'
## The following objects are masked from 'package:reshape':
##
## colsplit, melt, recast
## Warning in ggcorr(data_set, nbreaks = 4, label = TRUE, label_size = 2,
## label_color = "white"): data in column(s) 'data' are not numeric and were
## ignored
data_set <- data_set %>% mutate(data_format=format(as.POSIXct(data, format='%m/%d/%Y %H:%M'), "%Y-%m"))
kwh_plot <- data_set %>% group_by(data_format, idsito) %>% summarise(suma=sum(kwh))
p <- ggplot(data = kwh_plot, aes(x=data_format, y=suma, color=factor(idsito))) +
geom_point() + labs(title = "Wykres energii w czasie i przestrzeni", x = "Data", y = "Ilość wytworzonej energii[kwh]") + theme(axis.text.x = element_text(angle = 90))
ggplotly(p)
set.seed(23)
df_clear <- data_set %>% select(idsito, irradiamento, humidity, kwh)
inTraining <- createDataPartition(
y = df_clear$idsito,
p = 0.85,
list = FALSE
)
training <- df_clear[inTraining,]
testing <- df_clear[-inTraining,]
ctrl <- trainControl(method="repeatedcv", number=2, repeats=5)
model <- train(
kwh ~ idsito + humidity + irradiamento,
data = training,
method = "lm",
metric = "RMSE",
trControl = ctrl
)
predict_kwh <- predict(model, testing)
dat <- data.frame(pred = predict_kwh, obs = testing$kwh)
defaultSummary(dat)
## RMSE Rsquared MAE
## 0.10639435 0.74410469 0.06410652
Na podstawie analizy atrybutów oraz modelu regresji można stwierdzić, że do przewidzenia wartość wytworzonej energiiprzez pojedynczy panel w danej godzinie najlepiej posłuży parametr dotyczący napromieniowania, wilgotnosci oraz azymutu. Trafność regresji została oszacowana na podstawie miary RMSE i jej wartość jest na poziomie 0.10.
#Podsumowanie modelu
print(summary(model))
##
## Call:
## lm(formula = .outcome ~ ., data = dat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.66577 -0.03691 -0.01354 0.01887 1.01985
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.075492 0.001279 59.03 <2e-16 ***
## idsito 0.095897 0.001776 53.99 <2e-16 ***
## humidity -0.098289 0.001558 -63.09 <2e-16 ***
## irradiamento 1.282707 0.002109 608.29 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1056 on 200418 degrees of freedom
## Multiple R-squared: 0.7487, Adjusted R-squared: 0.7487
## F-statistic: 1.991e+05 on 3 and 200418 DF, p-value: < 2.2e-16